package com.youdianstar.app.entity

import com.google.gson.annotations.SerializedName
import com.youdianstar.app.common.DataCode

/**
 * File: OrderDetailInfo
 * Description: 订单详情数据结构，匹配sw/app/rentbox/order/detail.html/V2接口
 */
data class OrderDetailInfo(
    @SerializedName("orderId")
    val orderId: Int,                      // 订单ID
    
    @SerializedName("uuid")
    val uuid: String,                      // 订单UUID（订单编号）
    
    @SerializedName("usingStatus")
    val usingStatus: Int,                  // 使用状态: 1=使用中, 2=已归还, 3=已购买(超时), 4=已购买(丢失), 5=已购买(其他)
    
    @SerializedName("usingStausText")
    val usingStausText: String?,          // 使用状态文本
    
    @SerializedName("pay")
    val pay: Boolean,                      // 是否已支付
    
    @SerializedName("manual")
    val manual: Boolean,                   // 是否手动处理
    
    @SerializedName("check")
    val check: Boolean,                    // 是否需要检查弹出状态
    
    @SerializedName("fee")
    val fee: Double,                       // 费用
    
    @SerializedName("securityFee")
    val securityFee: Double,               // 押金费用
    
    @SerializedName("createTime")
    val createTime: Long,                  // 创建时间
    
    @SerializedName("returnTime")
    val returnTime: Long?,                 // 归还时间
    
    @SerializedName("distanceTime")
    val distanceTime: String?,             // 使用时长文本（如："45 phút 18 giây"）
    
    @SerializedName("distanceTime2")
    val distanceTime2: String?,            // 使用时长文本2
    
    @SerializedName("box1SiteName")
    val box1SiteName: String,              // 租借地点
    
    @SerializedName("box2SiteName")
    val box2SiteName: String?,             // 归还地点
    
    @SerializedName("box1DeviceId")
    val box1DeviceId: String,              // 租借柜机设备ID
    
    @SerializedName("box2DeviceId")
    val box2DeviceId: String?,             // 归还柜机设备ID
    
    @SerializedName("singleDeviceUuid")
    val singleDeviceUuid: String,         // 充电宝设备UUID
    
    @SerializedName("ruleMinuteFree")
    val ruleMinuteFree: Int,               // 免费分钟数
    
    @SerializedName("ruleMinuteCycle")
    val ruleMinuteCycle: Int,              // 周期分钟数
    
    @SerializedName("ruleCycleFee")
    val ruleCycleFee: Double,              // 周期费用
    
    @SerializedName("ruleDayFee")
    val ruleDayFee: Double,                // 日费用
    
    @SerializedName("pay_way")
    val payWay: String?,                   // 支付方式（如："Momo"、"security"）
    
    @SerializedName("coupon_time")
    val couponTime: Int,                   // 优惠时长（分钟）
    
    @SerializedName("delayedStatus")
    val delayedStatus: Boolean?,            // 是否延期
    
    @SerializedName("delayTime")
    val delayTime: String?,                 // 延期时间文本
    
    @SerializedName("delayRemainingTime")
    val delayRemainingTime: String?,       // 延期剩余时间
    
    // 其他可能需要的字段
    @SerializedName("usingSecound")
    val usingSecound: Int = 0,             // 使用秒数
    
    @SerializedName("borrowTime")
    val borrowTime: Long?,                 // 租借时间
    
    @SerializedName("payTime")
    val payTime: Long?,                    // 支付时间
    
    @SerializedName("payFee")
    val payFee: Double = 0.0,              // 支付费用
    
    @SerializedName("box1DeviceUuid")
    val box1DeviceUuid: String?,           // 租借柜机UUID
    
    @SerializedName("box2DeviceUuid")
    val box2DeviceUuid: String?,           // 归还柜机UUID
    
    @SerializedName("singleId")
    val singleId: String? = null,          // 充电宝ID
    
    @SerializedName("couponName")
    val couponName: String? = null,        // 优惠券名称
    
    @SerializedName("couponTime")
    val couponTimeInt: Int? = null,       // 优惠时长（分钟）- 可能有多个同名字段
    
    // 优惠券相关字段
    @SerializedName("couponId")
    val couponId: Int? = null,           // 优惠券ID
    
    @SerializedName("couponFee")
    val couponFee: Double = 0.0,          // 优惠金额
    
    @SerializedName("couponSubsidy")
    val couponSubsidy: Int = 0,          // 优惠补贴
    
    // 优惠码相关字段
    @SerializedName("userPromoCodeId")
    val userPromoCodeId: Int? = null,    // 优惠码ID
    
    // 平台优惠相关字段
    @SerializedName("platformFee")
    val platformFee: Double = 0.0,       // 平台优惠金额
    
    // 税金相关字段
    @SerializedName("tax")
    val tax: Double = 0.0,               // 税率（百分比）
    
    @SerializedName("taxAmount")
    val taxAmount: Double = 0.0,         // 税金金额
    
    // 退款相关字段
    @SerializedName("refundAmount")
    val refundAmount: Double = 0.0,     // 退款金额
    
    // 优惠码金额（可能有不同的字段名）
    @SerializedName("promoFee")
    val promoFee: Double = 0.0,          // 优惠码优惠金额
    
    // 起步价相关字段
    @SerializedName("fistMinute")
    val fistMinute: Int = 0,             // 起步价时间（分钟）
    
    @SerializedName("fistMinuteFee")
    val fistMinuteFee: Double = 0.0,      // 起步价金额
    
    // 货币相关
    @SerializedName("currencyFee")
    val currencyFee: Double = 0.0,       // 货币金额
    
    @SerializedName("commissionFee")
    val commissionFee: Double = 0.0,     // 佣金费用
    
    // 规则押金相关
    @SerializedName("ruleSecurityFee")
    val ruleSecurityFee: Double = 0.0,   // 规则押金金额
    
    // 使用时长相关（秒）
    @SerializedName("seconds")
    val seconds: Long = 0L,             // 使用时长（秒，用于前端计算）
    
    // 支付相关
    @SerializedName("payUuid")
    val payUuid: String? = null,        // 支付流水号
    
    @SerializedName("securityOrderId")
    val securityOrderId: Int? = null,   // 押金订单ID
    
    @SerializedName("security")
    val security: Boolean = false        // 是否有押金
) {
    /**
     * 将新接口数据转换为旧的OrderInfo格式（用于兼容现有代码）
     */
    fun toOrderInfo(): OrderInfo {
        return OrderInfo(
            pageType = 0,
            orderNo = uuid,                      // 使用uuid作为订单编号
            createTime = createTime,
            endTime = returnTime ?: 0L,
            useDuration = usingSecound.toLong(),
            chargeCardDuration = couponTime.toLong(),
            rentBranchName = box1SiteName,
            rentCabinetNo = box1DeviceId,
            pbNo = singleDeviceUuid,
            returnBranchName = box2SiteName ?: "",
            returnCabinetNo = box2DeviceId ?: "",
            billing = BillingPlan(
                freeDuration = ruleMinuteFree,
                freeLimit = 0,
                cycle = ruleMinuteCycle,
                amount = ruleCycleFee.toFloat(),
                dayAmount = ruleDayFee.toFloat(),
                penaltyAmount = 0f
            ),
            money = if (!pay && usingStatus == 2) fee else 0.0,
            realAmount = payFee,
            orderAmount = fee,
            state = when (usingStatus) {
                1 -> DataCode.STATE_RENTING      // 使用中
                2 -> if (!pay) DataCode.STATE_UNPAID else DataCode.STATE_COMPLETE  // 已归还
                3, 4, 5 -> DataCode.STATE_COMPLETE  // 已购买
                else -> DataCode.STATE_COMPLETE
            },
            paymentMethod = when (payWay?.lowercase()) {
                "momo" -> 7
                "zalopay" -> 8
                "security" -> 9
                else -> -1
            },
            paymentState = if (pay) 1 else 0,
            lost = usingStatus == 4              // 丢失状态
        )
    }
}

